﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TumbaloSoft.Models;
using System.Collections;
using TumbaloSoft.Helpers;
using TumbaloSoft.Helpers.QueryObjects;
using System.Web.Helpers;
using System.IO;
using System.Net.Mail;
using System.Net;

namespace TumbaloSoft.Controllers
{
	public class PerfilVendedorController : TumbaloController
    {
        private static Object lockObject = new Object();
        //
        // GET: /Inmueble/

        public ActionResult Index()
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                return View();
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al ingresar", ex);
                return View("~/Views/Shared/Error.cshtml");
            }            
        }

        //VER EL CATALOGO

        public ActionResult Catalogo(BusquedaInmueble inmuebleBuscar)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                IList listaDistritos = null;
                int numActivos = 0;
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();

                listaDistritos = HelperDistrito.selectAll();
                numActivos = HelperInmueble.selectCountActivosCatalogo();
                if (inmuebleBuscar.prTipoInmueble == null)
                {
                    inmuebleBuscar.prTipoInmueble = new TipoInmueble();
                    inmuebleBuscar.prTipoInmueble.prIdTipoInmueble = 0;
                }
                ViewBag.ListaInmueble = HelperInmueble.buscarCatalogo(inmuebleBuscar);

                ViewBag.prevPage = inmuebleBuscar.prPage - 1;
                ViewBag.nextPage = inmuebleBuscar.prPage + 1;
                ViewBag.numPages = numActivos / inmuebleBuscar.prPageSize;
                if ((numActivos % inmuebleBuscar.prPageSize) > 0) ViewBag.numPages++;

                ViewBag.listaDistritos = listaDistritos;
                return View(inmuebleBuscar);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar cargar el catalogo", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }


        public ActionResult Consulta(BusquedaConsulta consultaBuscar)
        {
            if (defaultAction != null) return defaultAction;
            int numActivos = 0;
            try
            {

                numActivos = HelperConsulta.selectCountActivos();
                ViewBag.ListaConsulta = HelperConsulta.buscar(consultaBuscar);
                List<Consulta> consultas = new List<Consulta>();
                //LISTA DE PERSONAS               
                List<PersonaNatural> naturales = new List<PersonaNatural>();
                List<PersonaJuridica> juridicas = new List<PersonaJuridica>();

                foreach (Consulta con in ViewBag.ListaConsulta)
                {
                    Consulta consulta = HelperConsulta.selectById(con.prIdConsulta);
                    if (consulta.prMensaje == null) consulta.prMensaje = "  -  ";
                    if (HelperPersonaNatural.EsPersonaNatural(consulta.prIdPersona))
                    {

                        PersonaNatural per = HelperPersonaNatural.selectById(consulta.prIdPersona);                       
                        naturales.Add(per);
                    }
                    else //ES UNA PERSONA JURIDICA
                    {
                        PersonaJuridica perj = HelperPersonaJuridica.selectById(consulta.prIdPersona);
                        juridicas.Add(perj);
                    }
                    consultas.Add(consulta);
                }

                ViewBag.Consultas = consultas;
                ViewBag.Naturales = naturales;
                ViewBag.Juridicas = juridicas;
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar cargar las consultas", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

            ViewBag.prevPage = consultaBuscar.prPage - 1;
            ViewBag.nextPage = consultaBuscar.prPage + 1;
            ViewBag.numPages = numActivos / consultaBuscar.prPageSize;
            if ((numActivos % consultaBuscar.prPageSize) > 0) ViewBag.numPages++;

            return View(consultaBuscar);
        }


        public ActionResult ResponderConsulta(int? prIdConsulta, MyViewModel model)
        {
            if (defaultAction != null) return defaultAction;
            if (!prIdConsulta.HasValue)
            {
                return View("~/Views/Shared/Error.cshtml");
            }
            else
            {
                try
                {
                    model = new MyViewModel();
                    model.Consulta = HelperConsulta.selectById(prIdConsulta.Value);

                    if (HelperPersonaNatural.EsPersonaNatural(model.Consulta.prIdPersona) == true)
                    {
                        model.PersonaNatural = HelperPersonaNatural.selectById(model.Consulta.prIdPersona);
                        model.PersonaJuridica = null;
                    }
                    else
                    {
                        model.PersonaJuridica = HelperPersonaJuridica.selectById(model.Consulta.prIdPersona);
                        model.PersonaNatural = null;
                    }
                }
                catch (Exception ex)
                {
                    Logger.Current.Error("Error al intentar ver la consulta", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }

                return View(model);
            }
        }

        [HttpPost]
        public ActionResult ResponderConsulta(string respuesta, MyViewModel model, int? prIdConsulta)
        {
            if (defaultAction != null) return defaultAction;
            if (respuesta == null)
            {
                ModelState.AddModelError("mensaje", "Debe de ingresar una respuesta");
            }
            else
            {
                try
                {
                    model = new MyViewModel();
                    model.Consulta = HelperConsulta.selectById(prIdConsulta.Value);
                    string mensaje = " " + respuesta + " TumbaloCorp. Muchas Gracias. ";

                    if (HelperPersonaNatural.EsPersonaNatural(model.Consulta.prIdPersona) == true)
                    {
                        PersonaNatural personaN = HelperPersonaNatural.selectById(model.Consulta.prIdPersona);
                        SendEmail((string)(personaN.prEmail), "Confirmación de solicitud de contacto", "Estimado(a) Sr(a). " + personaN.prNombre + mensaje);
                    }
                    else
                    {
                        PersonaJuridica personaJ = HelperPersonaJuridica.selectById(model.Consulta.prIdPersona);
                        SendEmail((string)(personaJ.prEmail), "Confirmación de solicitud de contacto", "Estimado(a) Sr(a). " + personaJ.prRazonSocial + mensaje);
                    }

                    HelperConsulta.update(model.Consulta);
                    ViewBag.mensaje = "Se envio correctamente la respuesta";
                    ViewBag.returnURL = "../PerfilVendedor";
                    return View("~/Views/Shared/Exito.cshtml");
                }
                catch (Exception ex)
                {
                    Logger.Current.Error("Error al intentar responder la consulta", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
            }
            
            return View();
        }




        public void SendEmail(string address, string subject, string message)
        {
            try
            {
                string email = "tumbalocorp@gmail.com";
                string password = "tumbalo123";

                var loginInfo = new NetworkCredential(email, password);
                var msg = new MailMessage();
                var smtpClient = new SmtpClient("smtp.gmail.com", 587);

                msg.From = new MailAddress(email);
                msg.To.Add(new MailAddress(address));
                msg.Subject = subject;
                msg.Body = message;
                msg.IsBodyHtml = true;

                smtpClient.EnableSsl = true;
                smtpClient.UseDefaultCredentials = false;
                smtpClient.Credentials = loginInfo;
                smtpClient.Send(msg);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar enviar la respuesta", ex);
                RedirectToAction("~/Views/Shared/Error.cshtml"); 
            }
        }

        public ActionResult Cita(BusquedaCita citaBuscar)
        {
            if (defaultAction != null) return defaultAction;
            int numActivos = 0;
            try
            {
                int idPersona = AccountController.getIdPersona(HttpContext);//VER ESTOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO                
                citaBuscar.prIdVendedor = HelperVendedor.IdVendedor(idPersona);//VER ESTOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
                numActivos = HelperCita.selectCountAprobado(citaBuscar.prIdVendedor);// SOLO LOS QUE ESTAN APROBADOS
                
                ViewBag.ListaCita = HelperCita.buscarAprobado(citaBuscar);//SOLO LOS QUE ESTAN APROBADOS
                ViewBag.ListaInmueble = HelperInmueble.selectAll();
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al intentar cargar la lista de citas", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

            ViewBag.prevPage = citaBuscar.prPage - 1;
            ViewBag.nextPage = citaBuscar.prPage + 1;
            ViewBag.numPages = numActivos / citaBuscar.prPageSize;
            if ((numActivos % citaBuscar.prPageSize) > 0) ViewBag.numPages++;

            return View(citaBuscar);
        }


        [HttpPost]
        public ActionResult Cita(List<bool> Aprobar, BusquedaCita citaBuscar)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                Boolean existeAlguno = false;
                int numActivos = 0;
                int idPersona = AccountController.getIdPersona(HttpContext);//VER ESTOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO                
                citaBuscar.prIdVendedor = HelperVendedor.IdVendedor(idPersona);//VER ESTOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

                numActivos = HelperCita.selectCountAprobado(citaBuscar.prIdVendedor);// SOLO LOS QUE ESTAN APROBADOS
                
                ViewBag.ListaCita = HelperCita.buscarAprobado(citaBuscar);//SOLO LOS QUE ESTAN APROBADOS
                ViewBag.ListaInmueble = HelperInmueble.selectAll();

                for (int i = 0; i < Aprobar.Count; i++)
                {
                    if (Aprobar[i] == true)
                    {
                        existeAlguno = true;
                        ViewBag.ListaCita[i].prEstado = "ELIMINADO";
                        HelperCita.updateEstado(ViewBag.ListaCita[i]);
                    }
                }

                if (existeAlguno == false)
                {
                    ViewBag.mensaje = "No se escogio ninguna cita";
                }
                else
                {
                    ViewBag.mensaje = "Se registraron los cambios de las citas seleccionadas";
                }
                ViewBag.returnURL = "/PerfilVendedor";
                return View("~/Views/Shared/Exito.cshtml");
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar modificar datos de las citas seleccionadas", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        //INMUEBLE

        public ActionResult InmuebleIndex(BusquedaInmueble inmuebleBuscar)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                IList listaDistritos = null;
                int numActivos = 0;
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                ViewBag.Monedas = HelperMoneda.selectAll();
                listaDistritos = HelperDistrito.selectAll(); 
                numActivos = HelperInmueble.selectCountActivos();
                if (inmuebleBuscar.prTipoInmueble == null)
                {
                    inmuebleBuscar.prTipoInmueble = new TipoInmueble();
                    inmuebleBuscar.prTipoInmueble.prIdTipoInmueble = 0;
                }
                ViewBag.ListaInmueble = HelperInmueble.buscar(inmuebleBuscar);

                ViewBag.prevPage = inmuebleBuscar.prPage - 1;
                ViewBag.nextPage = inmuebleBuscar.prPage + 1;
                ViewBag.numPages = numActivos / inmuebleBuscar.prPageSize;
                if ((numActivos % inmuebleBuscar.prPageSize) > 0) ViewBag.numPages++;

                ViewBag.listaDistritos = listaDistritos;
                return View(inmuebleBuscar);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar cargar la lista de inmuebles", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }


        public ActionResult ModificarInmueble(int? prIdInmueble)
        {
            if (defaultAction != null) return defaultAction;

            try
            {
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                List<Int32> listaAnhos = new List<Int32>();
                ViewBag.listaMoneda = HelperMoneda.selectAll();
                for (int i = 0; i < 80; i++)
                {
                    listaAnhos.Add(Int32.Parse(DateTime.Now.Year.ToString()) - i);
                }
                ViewBag.listaAnhos = listaAnhos;
                ViewBag.listaDistrito = HelperDistrito.selectAll();
                if (!prIdInmueble.HasValue) return View();//se llamo sin parametro deberia devolver error
                Inmueble inmueble = HelperInmueble.selectById(prIdInmueble.Value);
                if (inmueble == null) return View();

                return View(inmueble);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar modificar el inmueble", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

        }

        [HttpPost]
        public ActionResult ModificarInmueble(Inmueble inm)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                Inmueble inmueble = HelperInmueble.selectById(inm.prIdInmueble);
                inm.prEstado = inmueble.prEstado;
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                ViewBag.listaMoneda = HelperMoneda.selectAll();
                List<Int32> listaAnhos = new List<Int32>();

                for (int i = 0; i < 80; i++)
                {
                    listaAnhos.Add(Int32.Parse(DateTime.Now.Year.ToString()) - i);
                }
                ViewBag.listaAnhos = listaAnhos;
                ViewBag.listaDistrito = HelperDistrito.selectAll();
                if (ModelState.IsValid)
                {
                   HelperInmueble.update(inm);

                }

                ViewBag.mensaje = "Se modifico correctamente el inmueble";
                ViewBag.returnURL = "../PerfilVendedor/InmuebleIndex";
                return View("~/Views/Shared/Exito.cshtml");
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar modificar el inmueble", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        public ActionResult EliminarInmueble(int? prIdInmueble)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                ViewBag.listaMoneda = HelperMoneda.selectAll();
                List<Int32> listaAnhos = new List<Int32>();

                for (int i = 0; i < 80; i++)
                {
                    listaAnhos.Add(Int32.Parse(DateTime.Now.Year.ToString()) - i);
                }
                ViewBag.listaAnhos = listaAnhos;
                ViewBag.listaDistrito = HelperDistrito.selectAll();

                if (!prIdInmueble.HasValue) return View();//se llamo sin parametro deberia devolver error
                Inmueble inmueble = HelperInmueble.selectById(prIdInmueble.Value);
                if (inmueble == null) return View();//si el inmueble no se encontro//tambien deberia devolver error
                return View(inmueble);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar eliminar el inmueble", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        [HttpPost]
        public ActionResult EliminarInmueble(Inmueble inm)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                ViewBag.listaMoneda = HelperMoneda.selectAll();
                List<Int32> listaAnhos = new List<Int32>();

                for (int i = 0; i < 80; i++)
                {
                    listaAnhos.Add(Int32.Parse(DateTime.Now.Year.ToString()) - i);
                }
                ViewBag.listaAnhos = listaAnhos;
                ViewBag.listaDistrito = HelperDistrito.selectAll();                
                HelperInmueble.delete(inm);
                ViewBag.mensaje = "Se elimino correctamente el inmueble";
                ViewBag.returnURL = "../PerfilVendedor/InmuebleIndex";
                return View("~/Views/Shared/Exito.cshtml");
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar eliminar el inmueble", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }


        public ActionResult RegistrarInmueble(int? prIdPersona)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                if (prIdPersona.HasValue)
                {
                    ViewBag.idPersona = prIdPersona;
                }

                List<Int32> listaAnhos = new List<Int32>();

                for (int i = 0; i < 80; i++)
                {
                    listaAnhos.Add(Int32.Parse(DateTime.Now.Year.ToString()) - i);
                }

                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                ViewBag.listaMoneda = HelperMoneda.selectAll();
                ViewBag.listaAnhos = listaAnhos;
                ViewBag.listaDistrito = HelperDistrito.selectAll();
                return View();
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar registrar el inmueble", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        [HttpPost]
        public ActionResult RegistrarInmueble(Inmueble inm)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                //Llamar a todas las listas que se utilizan
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                List<Int32> listaAnhos = new List<Int32>();

                for (int i = 0; i < 80; i++)
                {
                    listaAnhos.Add(Int32.Parse(DateTime.Now.Year.ToString()) - i);
                }
                ViewBag.listaAnhos = listaAnhos;
                ViewBag.listaMoneda = HelperMoneda.selectAll();
                ViewBag.listaDistrito = HelperDistrito.selectAll();
                //Todo lo anterior es por si sale algun error del tipo Null Reference, que representa el llamado a todas las listas usadas en el ActionResult MI_nuevo()

                inm.prEstado = "REGISTRADO";
                var image = WebImage.GetImageFromRequest();
                var filename = Path.GetFileName(image.FileName);
                var extension = Path.GetExtension(image.FileName);

                ModelState.Remove("prDuenho.prDireccion");
                if (ModelState.IsValid)
                {
                    
                    filename = inm.prDuenho.prIdPersona + "-" + inm.prIdInmueble + "-" + inm.prTipoInmueble.prIdTipoInmueble + "" + extension;

                    var path = Path.Combine(Server.MapPath("../Imagenes/Inmuebles/"), filename);
                    image.Save(path);
                    inm.prImagen = Url.Content(Path.Combine("../Imagenes/Inmuebles/", filename));

                    lock (lockObject)
                    {
                        inm.prIdInmueble = HelperInmueble.SiguienteCodigo();
                        HelperInmueble.insert(inm);
                    }

                    ViewBag.mensaje = "Se registro correctamente el inmueble";
                    ViewBag.returnURL = "../PerfilVendedor/InmuebleIndex";
                    return View("~/Views/Shared/Exito.cshtml");
                }
                else return View(inm);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar registrar el inmueble", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        public ActionResult BuscarClienteIndex()
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                return View();

            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al ver tipo persona", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }


        [HttpPost]
        public ActionResult BuscarClienteIndex(string tipoPersona)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                if (tipoPersona == "N") return RedirectToAction("IndexPersonaNatural");
                else return RedirectToAction("IndexPersonaJuridica");
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al ver tipo persona", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        public ActionResult IndexPersonaNatural(BusquedaPersonaNatural personaNaturalBuscar)
        {
            if (defaultAction != null) return defaultAction;
            int numActivos = 0;

            try
            {
                numActivos = HelperPersonaNatural.selectCountActivos();
                ViewBag.ListaPersonaNatural = HelperPersonaNatural.buscar(personaNaturalBuscar);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar cargar la lista de personas naturales", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

            ViewBag.prevPage = personaNaturalBuscar.prPage - 1;
            ViewBag.nextPage = personaNaturalBuscar.prPage + 1;
            ViewBag.numPages = numActivos / personaNaturalBuscar.prPageSize;
            if ((numActivos % personaNaturalBuscar.prPageSize) > 0) ViewBag.numPages++;

            return View(personaNaturalBuscar);
        }

        public ActionResult IndexPersonaJuridica(BusquedaPersonaJuridica personaJuridicaBuscar)
        {
            if (defaultAction != null) return defaultAction;
            int numActivos = 0;

            try
            {
                numActivos = HelperPersonaJuridica.selectCountActivos();
                ViewBag.ListaPersonaJuridica = HelperPersonaJuridica.buscar(personaJuridicaBuscar);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar cargar la lista de personas juridicas", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

            ViewBag.prevPage = personaJuridicaBuscar.prPage - 1;
            ViewBag.nextPage = personaJuridicaBuscar.prPage + 1;
            ViewBag.numPages = numActivos / personaJuridicaBuscar.prPageSize;
            if ((numActivos % personaJuridicaBuscar.prPageSize) > 0) ViewBag.numPages++;

            return View(personaJuridicaBuscar);
        }


        //CLIENTE

        public ActionResult PersonaIndex()
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                return View();
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al ver tipo persona", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        [HttpPost]
        public ActionResult PersonaIndex(string tipoPersona)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                if (tipoPersona == "N") return RedirectToAction("IndexClienteNatural");
                else return RedirectToAction("IndexClienteJuridica");
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al ver tipo persona", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }
        }

        //CLIENTE NATURAL

        public ActionResult IndexClienteNatural(BusquedaPersonaNatural personaNaturalBuscar)
        {
            if (defaultAction != null) return defaultAction;
            int numActivos = 0;

            try
            {
                numActivos = HelperPersonaNatural.selectCountActivos();
                ViewBag.ListaPersonaNatural = HelperPersonaNatural.buscar(personaNaturalBuscar);

                ViewBag.prevPage = personaNaturalBuscar.prPage - 1;
                ViewBag.nextPage = personaNaturalBuscar.prPage + 1;
                ViewBag.numPages = numActivos / personaNaturalBuscar.prPageSize;
                if ((numActivos % personaNaturalBuscar.prPageSize) > 0) ViewBag.numPages++;

                return View(personaNaturalBuscar);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar cargar la lista de personas naturales", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        public ActionResult RegistrarPersonaNatural()
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                IList listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                return View();
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar registrar a la persona natural", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }
        }


        [HttpPost]

        public ActionResult RegistrarPersonaNatural(PersonaNatural personaNatural, string prSexo)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                TipoDocumento ti = (TipoDocumento)HelperTipoDocumento.selectById(personaNatural.prTipoDocumento.prIdTipoDocumento); 
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                personaNatural.prIdTipoPersona = 1;
                personaNatural.prTipoDocumento = ti;
                personaNatural.prEstado = "ACTIVO";
                personaNatural.prSexo = prSexo;



                Boolean existe = HelperPersonaNatural.ExistePersona(personaNatural.prCodigoDocumento);
                Boolean esMayor = EsMayorEdad(personaNatural.prFechaNacimiento);
                if (existe == true)
                {
                    ModelState.AddModelError("prCodigoDocumento", "Ya existe la persona");
                    return View(personaNatural);
                }
                if (esMayor == false)
                {
                    ModelState.AddModelError("prFechaNacimiento", "La persona debe de ser mayor de edad");
                    return View(personaNatural);
                }
                else if (ModelState.IsValid)
                {
                    lock (lockObject)
                    {
                        personaNatural.prIdPersona = (int)(HelperPersonaNatural.SiguienteCodigo());
                        HelperPersonaNatural.insert(personaNatural);
                    }
                    ViewBag.mensaje = "Se registro correctamente al cliente Sr(a). " + personaNatural.prNombre + " " + personaNatural.prApellidoPaterno;
                    ViewBag.returnURL = "/PerfilVendedor/IndexClienteNatural";
                    return View("~/Views/Shared/Exito.cshtml");

                }


                else return View(personaNatural);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar registrar a la persona natural", ex); 
                return View("~/Views/Shared/Error.cshtml"); 
            }
        }


        //MODIFICAR NATURAL

        public ActionResult ModificarPersonaNatural(int? prIdPersona, BusquedaPersonaNatural personaNaturalBuscar)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                IList listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();


                if (!prIdPersona.HasValue)
                {
                    return View();
                }

                else
                {
                    ViewBag.ListaPersonaNatural = HelperPersonaNatural.buscar(personaNaturalBuscar);
                    PersonaNatural personaNatural = HelperPersonaNatural.selectById(prIdPersona.Value);
                    if (personaNatural == null) return View();

                    return View(personaNatural);
                }
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar modificar a la persona natural", ex); 
                return View("~/Views/Shared/Error.cshtml"); 
            }

        }


        [HttpPost]
        public ActionResult ModificarPersonaNatural(PersonaNatural personaNatural, BusquedaPersonaNatural personaNaturalBuscar)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.ListaPersonaNatural = HelperPersonaNatural.buscar(personaNaturalBuscar);
                personaNatural.prIdTipoPersona = 1;
                personaNatural.prEstado="ACTIVO";    

                Boolean esMayor = EsMayorEdad(personaNatural.prFechaNacimiento);
                if (esMayor == false)
                {
                    ModelState.AddModelError("prFechaNacimiento", "La persona debe de ser mayor de edad");
                    return View(personaNatural);
                }

                else if (ModelState.IsValid)
                {
                    HelperPersonaNatural.update(personaNatural);
                    ViewBag.mensaje = "Se modificaron correctamente los datos del cliente Sr(a). " + personaNatural.prNombre + " " + personaNatural.prApellidoPaterno;
                    ViewBag.returnURL = "/PerfilVendedor/IndexClienteNatural";
                    return View("~/Views/Shared/Exito.cshtml");
                }

                return View(personaNatural);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar modificar a la persona natural", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }

        }


        //ELIMINAR CLIENTE

        public ActionResult EliminarPersonaNatural(int? prIdPersona, BusquedaPersonaNatural personaNaturalBuscar)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                IList listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();

                ViewBag.ListaPersonaNatural = HelperPersonaNatural.buscar(personaNaturalBuscar);

                if (!prIdPersona.HasValue)
                {
                    return View();
                }

                else
                {
                    ViewBag.ListaPersonaNatural = HelperPersonaNatural.buscar(personaNaturalBuscar);
                    PersonaNatural personaNatural = HelperPersonaNatural.selectById(prIdPersona.Value);
                    if (personaNatural == null) return View();
                    return View(personaNatural);
                }
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar eliminar a la persona natural", ex); 
                return View("~/Views/Shared/Error.cshtml"); 
            }

        }


        [HttpPost]
        public ActionResult EliminarPersonaNatural(PersonaNatural personaNatural)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                IList listaTipo = HelperTipoDocumento.selectAll();
                ViewBag.listaTipo = HelperTipoDocumento.selectAll();

                HelperPersonaNatural.delete(personaNatural);
                ViewBag.mensaje = "Se elimino correctamente al cliente Sr(a). " + personaNatural.prNombre + " " + personaNatural.prApellidoPaterno;
                ViewBag.returnURL = "/PerfilVendedor/IndexClienteNatural";
                return View("~/Views/Shared/Exito.cshtml");

            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar eliminar a la persona natural", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }

        }


        //PERSONA JURIDICA:

        public ActionResult IndexClienteJuridica(BusquedaPersonaJuridica personaJuridicaBuscar)
        {
            if (defaultAction != null) return defaultAction;
            int numActivos = 0;
            try
            {

                numActivos = HelperPersonaJuridica.selectCountActivos();
                ViewBag.ListaPersonaJuridica = HelperPersonaJuridica.buscar(personaJuridicaBuscar);

            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar cargar la lista de las personas juridicas", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }

            ViewBag.prevPage = personaJuridicaBuscar.prPage - 1;
            ViewBag.nextPage = personaJuridicaBuscar.prPage + 1;
            ViewBag.numPages = numActivos / personaJuridicaBuscar.prPageSize;
            if ((numActivos % personaJuridicaBuscar.prPageSize) > 0) ViewBag.numPages++;
            return View(personaJuridicaBuscar);
        }


        public ActionResult RegistrarPersonaJuridica()
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                return View();
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar registrar a la persona juridica", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        [HttpPost]
        public ActionResult RegistrarPersonaJuridica(PersonaJuridica personaJuridica)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                //personaJuridica.prIdPersona = (int)(HelperPersonaJuridica.SiguienteCodigo());
                personaJuridica.prIdTipoPersona = 1;
                personaJuridica.prEstado = "ACTIVO";

                if (personaJuridica.prRuc == null)
                {

                    ModelState.AddModelError("prRuc", "Se requiere saber el Ruc");
                }

                if (ModelState.IsValid)
                {
                    lock (lockObject)
                    {
                        personaJuridica.prIdPersona = (int)(HelperPersonaJuridica.SiguienteCodigo());
                        HelperPersonaJuridica.insert(personaJuridica);
                    }
                    ViewBag.mensaje = "Se registro correctamente al cliente Empresa: " + personaJuridica.prRazonSocial;
                    ViewBag.returnURL = "/PerfilVendedor/IndexClienteJuridica";
                    return View("~/Views/Shared/Exito.cshtml");

                }


                else return View(personaJuridica);
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar registrar a la persona juridica", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }

        }


        public ActionResult ModificarPersonaJuridica(int? prIdPersona, BusquedaPersonaJuridica personaJuridicaBuscar)
        {
            if (defaultAction != null) return defaultAction;

            try
            {
                ViewBag.ListaPersonaJuridica = HelperPersonaJuridica.buscar(personaJuridicaBuscar);
                //MI_modificar sin parametros
                if (!prIdPersona.HasValue)
                {
                    return View();
                }
                //MI_modificar con id?
                else
                {
                    ViewBag.ListaPersonaJuridica = HelperPersonaJuridica.buscar(personaJuridicaBuscar);
                    PersonaJuridica personaJuridica = HelperPersonaJuridica.selectById(prIdPersona.Value);
                    if (personaJuridica == null) return View();
                    return View(personaJuridica);
                }
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar modificar a la persona juridica", ex); 
                return View("~/Views/Shared/Error.cshtml"); 
            }
        }

        [HttpPost]
        public ActionResult ModificarPersonaJuridica(PersonaJuridica personaJuridica, BusquedaPersonaJuridica personaJuridicaBuscar)
        {
            if (defaultAction != null) return defaultAction;

            try
            {
                personaJuridica.prIdTipoPersona = 1;
                personaJuridica.prEstado = "ACTIVO";
                ViewBag.ListaPersonaJuridica = HelperPersonaJuridica.buscar(personaJuridicaBuscar);


                if (ModelState.IsValid)
                {
                    HelperPersonaJuridica.update(personaJuridica);
                    ViewBag.mensaje = "Se modificaron los datos de la Empresa: " + personaJuridica.prRazonSocial;
                    ViewBag.returnURL = "/PerfilVendedor/IndexClienteJuridica";
                    return View("~/Views/Shared/Exito.cshtml");
                }

                return View();
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar modificar a la persona juridica", ex); 
                return View("~/Views/Shared/Error.cshtml"); 
            }
        }


        public ActionResult EliminarPersonaJuridica(int? prIdPersona, BusquedaPersonaJuridica personaJuridicaBuscar)
        {
            if (defaultAction != null) return defaultAction;

            try
            {
                ViewBag.ListaPersonaJuridica = HelperPersonaJuridica.buscar(personaJuridicaBuscar);
                //MI_modificar sin parametros
                if (!prIdPersona.HasValue)
                {
                    return View("~/Views/Shared/Error.cshtml");
                }
                //MI_modificar con id?
                else
                {
                    ViewBag.ListaPersonaJuridica = HelperPersonaJuridica.buscar(personaJuridicaBuscar);
                    PersonaJuridica personaJuridica = HelperPersonaJuridica.selectById(prIdPersona.Value);
                    if (personaJuridica == null) return View();
                    return View(personaJuridica);
                }
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar eliminar a la persona juridica", ex);  
                return View("~/Views/Shared/Error.cshtml"); 
            }
        }

        [HttpPost]
        public ActionResult EliminarPersonaJuridica(PersonaJuridica personaJuridica)
        {
            if (defaultAction != null) return defaultAction;

            try
            {
                HelperPersonaJuridica.delete(personaJuridica);
                ViewBag.mensaje = "Se elimino correctamente a la Empresa" + personaJuridica.prRazonSocial;
                ViewBag.returnURL = "/PerfilVendedor/IndexClienteJuridica";
                return View("~/Views/Shared/Exito.cshtml");
             }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al intentar eliminar a la persona juridica", ex); 
                 return View("~/Views/Shared/Error.cshtml"); 
             }
        }


        public Boolean EsMayorEdad(DateTime fechaNacimiento)
        {
            try
            {
                int edad = DateTime.Today.Year - fechaNacimiento.Year;
                if (new DateTime(DateTime.Today.Year, fechaNacimiento.Month, fechaNacimiento.Day) > DateTime.Today) edad--;
                if (edad > 18 && edad < 65) return true;
                else return false;
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error en la edad ", ex);
                return false;
            }

        }
    }
}